package com.hiv.client.model.weixin;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.List;

/**
 * 申请退款res
 * https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_9.shtml
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WeixinJsRefundOrderRes implements Serializable {
    /** 微信支付退款单号 示例值：50000000382019052709732678859 */
    private String refund_id;
    /** 商户退款单号 示例值：1217752501201407033233368018 */
    private String out_refund_no;
    /** 微信支付订单号 示例值：1217752501201407033233368018 */
    private String transaction_id;
    /** 商户订单号 示例值：商品已售完 */
    private String out_trade_no;
    /**
     * 退款渠道
     * 枚举值：
     * ORIGINAL：原路退款
     * BALANCE：退回到余额
     * OTHER_BALANCE：原账户异常退到其他余额账户
     * OTHER_BANKCARD：原银行卡异常退到其他银行卡
     */
    private String channel;
    /** 退款入账账户 示例值：招商银行信用卡0403 */
    private String user_received_account;
    /** 退款成功时间 示例值：2020-12-01T16:18:12+08:00 */
    private String success_time;
    /** 退款创建时间 示例值：2020-12-01T16:18:12+08:00 */
    private String create_time;
    /**
     * 退款状态
     * 退款到银行发现用户的卡作废或者冻结了，导致原路退款银行卡失败，可前往商户平台-交易中心，手动处理此笔退款。
     * 枚举值：
     * SUCCESS：退款成功
     * CLOSED：退款关闭
     * PROCESSING：退款处理中
     * ABNORMAL：退款异常
     * 示例值：SUCCESS
     */
    private String status;
    /**
     * 资金账户
     * 退款所使用资金对应的资金账户类型
     * 枚举值：
     * UNSETTLED : 未结算资金
     * AVAILABLE : 可用余额
     * UNAVAILABLE : 不可用余额
     * OPERATION : 运营户
     * BASIC : 基本账户（含可用余额和不可用余额）
     * 示例值：UNSETTLED
     */
    private String funds_account;
    /** 金额信息 */
    private AmountDTO amount;
    /** 优惠退款信息   */
    private List<PromotionDetailDTO> promotion_detail;

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class AmountDTO {
        /** 订单金额  */
        private Integer total;
        /** 退款金额  */
        private Integer refund;
        /** 退款出资账户及金额  */
        private List<FromDTO> from;
        /** 用户支付金额  */
        private Integer payer_total;
        /** 用户退款金额  */
        private Integer payer_refund;
        /** 应结退款金额  */
        private Integer settlement_refund;
        /** 应结订单金额  */
        private Integer settlement_total;
        /** 优惠退款金额  */
        private Integer discount_refund;
        /** 退款币种 */
        private String currency;
    }

    @Data
    @NoArgsConstructor
    public static class FromDTO {
        /** 出资账户类型 */
        private String account;
        /** 出资金额 */
        private Integer amount;
    }

    @Data
    @NoArgsConstructor
    public static class PromotionDetailDTO {
        /** 券ID */
        private String promotion_id;
        /** 优惠范围 */
        private String scope;
        /** 优惠类型 */
        private String type;
        /** 优惠券面额 */
        private Integer amount;
        /** 优惠退款金额 */
        private Integer refund_amount;
        /** 商品列表 */
        private GoodsDetailDTO goods_detail;
    }

    @Data
    @NoArgsConstructor
    public static class GoodsDetailDTO {
        /** 商户侧商品编码 */
        private String merchant_goods_id;
        /** 微信支付商品编码 */
        private String wechatpay_goods_id;
        /** 商品名称 */
        private String goods_name;
        /** 商品单价 */
        private Integer unit_price;
        /** 商品退款金额 */
        private Integer refund_amount;
        /** 商品退货数量 */
        private Integer refund_quantity;
    }
}
